class formula {

  /** 税率-速算扣除数 */
  getTaxQuick(yearTaxPayableNumber) {
    let taxrate;
    let quick;
    if (yearTaxPayableNumber <= 36000) {
      taxrate = 0.03;
      quick = 0;
    } else if (yearTaxPayableNumber > 36000 && yearTaxPayableNumber <= 144000) {
      taxrate = 0.1;
      quick = 2520;
    } else if (yearTaxPayableNumber > 144000 && yearTaxPayableNumber <= 300000) {
      taxrate = 0.2;
      quick = 16920;
    } else if (yearTaxPayableNumber > 300000 && yearTaxPayableNumber <= 420000) {
      taxrate = 0.25;
      quick = 31920;
    } else if (yearTaxPayableNumber > 420000 && yearTaxPayableNumber <= 660000) {
      taxrate = 0.3;
      quick = 52920;
    } else if (yearTaxPayableNumber > 660000 && yearTaxPayableNumber <= 960000) {
      taxrate = 0.35;
      quick = 85920;
    } else if (yearTaxPayableNumber > 960000) {
      taxrate = 0.45;
      quick = 181920;
    }
    return { taxrate, quick };
  }

  /** 累计收入额：=上月累计收入额+本月应发工资 */
  accrueIncome(income = 0, salary = 0) {
    return handleResult(income + salary);
  }

  /** 累计减除费用：
   * 1） 保持一致，减除费用=（当前月份-入职月份+1）*5000
   * 2） 晚一个月，减除费用=（当前月份-入职月份+2）*5000
   * @param {Number} type 税款所属期
   * @param {String} month 当前月份
   * @param {String} entryMonth 入职月份
   * @returns
   */
  accrueReduction({ type = 1, month = "2022-04", entryMonth = "2022-04" }) {
    return (countMonth(month, entryMonth) + (type ? 1 : 2)) * 5000;
  }

  /** 累计专项附加扣除合计：=累计子女教育+累计住房租金+累计住房贷款+累计继续教育+累计赡养老人+累计婴幼儿陪护 */
  accrueDeduct(...ages) {
    return handleResult(formulaSum(ages));
  }

  /**
   * 累计应纳税所得额：= 上期应纳税所得额+本期应税工资
   * 累计应纳税所得额：=
   * 累计收入额 -
   * 累计专项附加扣除 -
   * 累计专项扣除（截至上月） -
   * 个人社保公积金 -
   * 累计减除费用
   * @param {number} ljsre 累计收入额
   * @param {number} ljzxfjkcTotal 累计专项附加扣除
   * @param {number} ljzxkcjzsy 累计专项扣除（截至上月）
   * @param {number} personalSsafTotal 个人社保公积金
   * @param {number} ljjcfy 累计减除费用
   * @returns
   */
  accrueTaxableIncome({ ljsre = 0, ljzxfjkc = 0, ljzxkcjzsy = 0, personalSsafTotal = 0, ljjcfy = 0 }) {
    return handleResult(ljsre - ljzxfjkc - ljzxkcjzsy - personalSsafTotal - ljjcfy);
  }

  /** 累计应纳税额：= 累计应纳税所得额*所对应税率-速算扣除数   */
  accrueTaxable(data) {
    const yearTax = this.accrueTaxableIncome(data);
    const { taxrate, quick } = this.getTaxQuick(yearTax);
    return handleResult(yearTax * taxrate - quick);
  }

  /** 已预缴税额：=上期累计应纳税所得额 */
  advanceTax(prevTax = 0) {
    return handleResult(prevTax);
  }

  /** 应发工资：= 基础工资+绩效+提成+津贴补贴-考勤扣款+自定义增项-自定义减项
   * @param {*} param0
   * @returns
   */
  salary({ jcgz = 0, jx = 0, tc = 0, jtbt = 0, kqkk = 0, adds = [], minuses = [] }) {
    const add = formulaSum(adds);
    const minus = formulaSum(minuses);
    return handleResult(jcgz + jx + tc + jtbt - kqkk + add - minus);
  }

  /** 应税工资：=应发工资-个人社保公积金-专项附加扣除-减除费用
   * @param {Number} yfWages 应发工资
   * @param {Number} personalSsafTotal 个人社保公积金
   * @param {Number} ljzxfjkc 专项附加扣除
   * @param {Number} ljjcfy 减除费用
   * @returns
   */
  taxSalary({ yfWages = 0, personalSsafTotal = 0, ljzxfjkc = 0, ljjcfy = 0 }) {
    return handleResult(yfWages - personalSsafTotal - ljzxfjkc - ljjcfy);
  }

  /** 个人所得税：=累计应纳税额-已预缴税额 */
  oneselfTax(accrue = 0, advance = 0) {
    return handleResult(accrue - advance);
  }

  /** 实发工资：= 应发工资-个人社保公积金-个人所得税+自定义增项-自定义减项
   * @param {Number} yfWages 应发工资
   * @param {Number} personalSsafTotal 个人社保公积金
   * @param {Number} grTax 个人所得税
   * @param {Array} adds 自定义增项
   * @param {Array} minuses 自定义减项
   * @returns
   */
  actualSalary({ yfWages = 0, personalSsafTotal = 0, grTax = 0, adds = [], minuses = [] }) {
    return handleResult(yfWages - personalSsafTotal - grTax + formulaSum(adds) - formulaSum(minuses));
  }

  /** 个人社保公积金合计：=个人社保+个人公积金 */
  oneSelfformulaSum(...ages) {
    return handleResult(formulaSum(ages));
  }

  /** 企业社保公积金合计：=企业社保+企业公积金 */
  companyformulaSum(...ages) {
    return handleResult(formulaSum(ages));
  }

  /**
   * 考勤扣款合计
   */
  attsDeductionTotal(...ages) {
    return handleResult(formulaSum(ages));
  }

  /**
   * 加班费合计
   */
  overtimePay(...ages) {
    return handleResult(formulaSum(ages));
  }
}

/** 数组求和 */
export function formulaSum(arr) {
  console.log(arr);
  if (!arr.length) return 0;
  return arr.reduce((a = 0, b = 0) => Number(a) + Number(b));
}

/** 处理返回结果 */
export function handleResult(number) {
  number = Number(number);
  if (number < 0) return 0;
  return Number(number.toFixed(2));
}

/**
 * 计算月份差
 */
function countMonth(startDate, endDate) {
  // 拆分年月日
  const startArr = startDate.split("-");
  // 得到月数
  const start = parseInt(startArr[0]) * 12 + parseInt(startArr[1]);
  // 拆分年月日
  const endArr = endDate.split("-");
  // 得到月数
  const end = parseInt(endArr[0]) * 12 + parseInt(endArr[1]);
  return Math.abs(start - end);
}
export default new formula();

export * from "./designFormulas"; // 计算公式相关内容
export * from "./systemFormulas"; // 计算系统公式相关内容